/*
 * Powered By XY
 * Since 2020
 */

package com.xy.biz.base.client;

import com.xy.biz.base.domain.req.*;
import com.xy.biz.base.domain.resp.GetGoodsResponse;
import com.xy.lang.domain.Page;
import com.xy.lang.domain.Result;
import org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 *
 *
 * @author zgy
 * @date 2021-9-22
 */
public interface GoodsClient {

    /**
     * 查找一个
     *
     * @param request
     * @return
     */
    Result<GetGoodsResponse> getGoods(GetGoodsRequest request);

    /**
     * 查找一个
     * @param request
     * @return
     */
    Result<GetGoodsResponse> getGoodsByCode(ListGoodsByCodeRequest request);

    /**
     * 查找一个
     * @param request
     * @return
     */
    Result<GetGoodsResponse> getGoodsByFullCode(ListGoodsByFullCodeRequest request);

    /**
     * 查找多个
     *
     * @param collection 标识集合
     * @return
     */
    Result<List<GetGoodsResponse>> listGoodsById(Collection<Long> collection);

    default Map<Long, GetGoodsResponse> mapGoodsById(Collection<Long> collection) {
        if(CollectionUtils.isEmpty(collection)) {
            return Collections.emptyMap();
        }
        Result<List<GetGoodsResponse>> result = listGoodsById(collection);
        if(result.wasFailure()) {
            return Collections.emptyMap();
        }
        List<GetGoodsResponse> list = result.getData();
        if(CollectionUtils.isEmpty(list)) {
            return Collections.emptyMap();
        }
        return list.stream().collect(Collectors.toMap(GetGoodsResponse::getGoodsId, e -> e));
    }

    /**
     * 查找多个
     *
     * @param request 查找条件
     * @return
     */
    Result<List<GetGoodsResponse>> listGoods(ListGoodsRequest request);

    /**
     * 查找多个
     *
     * @param request 查找条件
     * @return
     */
    Result<List<GetGoodsResponse>> listGoodsByCode(ListGoodsByCodeRequest request);

    /**
     * 查找多个
     *
     * @param request 查找条件
     * @return
     */
    Result<List<GetGoodsResponse>> listGoodsByFullCode(ListGoodsByFullCodeRequest request);

    /**
     * 查找多个
     *
     * @param request 查找条件
     * @return
     */
    Result<List<GetGoodsResponse>> listGoodsByAbbr(ListGoodsByAbbrRequest request);

    /**
     * 分页查找
     *
     * @param request 查找条件
     * @return
     */
    Result<Page<GetGoodsResponse>> pageGoods(ListGoodsRequest request);

    /**
     * 根据货号获取分类
     *
     * @param collection 货号集合
     * @return
     */
    Result<Map<String, Integer>> mapCategory(Collection<String> collection);

    /**
     * 返回原始货号，例如单抗去掉克隆株号，试剂去掉R1,R2等。
     *
     * @param goodsCode
     * @return
     */
    String getPrimitiveGoodsCode(String goodsCode);

}
